#============================================
# and 与 or
# 判断 如果and前为假，就为假，如果为真，就选后面的
# 判断 如果or前为真，就为真，如果为假，就选后面的

# 垃圾回收机制
# 1.引用计数
# 引用计数是解决垃圾回收机制的主要方法，他通过后对变量被引用的次数来判断，变量的价值，变量每被引用一次就会计数加1
# 引用减少就会计数减1，当计数为0时就会被清除。
# 2.标记清除
# 标价清除时用来辅助解决引用计数解决不了的循环问题(互相引用，删除直接引用，变量没用，但是又引用计数，删除不了)
# 变量名在栈区，变量在堆区，通过对栈区进行扫描，发现没有直接引用的变量名，直接删除掉。
# 3.分带回收
# 主要解决引用计数的效率问题，因为一旦项目过大，就会带来效率问题，它每次进行引用计数时，就会给通过引用计数的变量打分，
# 对于那些分高的就可以减少对他们扫描的频率，这样就可以提高效率。
#============================================
#知识点
#1.闭包函数(3点)
#2.*元组传参,**字典传参
#3.糖果雨
#4.边边角角的伪装就是在def wrapper上加速@wraps(func)伪装原函数的属性(from functools import wraps)
#============================================
#装饰器模板
# def out(func):
#     def wrapper(*args,kwargs):
#         res = func(*args,kwargs)
#         return res
#     return wrapper
#============================================
# import time
# #被装饰
# def qwq1(x,y,z):
#     print("1.成功输入：{},{},{}".format(x,y,z))
#     return "qwq"

# def qwq2(x,y,z):
#     print("2.成功输入：{},{},{}".format(x,y,z))
#     return "qwq"
# #装饰器
# def out(func):  #第二点func
#     def wrapper(*args,**kwargs):#第一点*args,**kwargs
#         start = time.time()
#         time.sleep(3)
#         res = func(*args,**kwargs)#第三点return
#         end = time.time()
#         print(end-start)
#         return res
#     return wrapper
# qwq2 = out(qwq2)  #f = out(qwq1的内存地址)
# #qwq2为之前的wrapper的内存地址，因为out（）当中的wrapper被返回了
# qwq1 = out(qwq1)
# qwq1(1,2,3)
# qwq2(4,5,6)
#============================================
# # #糖果雨  用法在被装饰器的上一行写上@装饰器名称
# # #注意装饰器要在被装饰器之前
# import time
# #装饰器
# def out(func):  #第二点func
#     def wrapper(*args,**kwargs):#第一点*args,**kwargs
#         start = time.time()
#         time.sleep(3)
#         res = func(*args,**kwargs)#第三点return
#         end = time.time()
#         print(end-start)
#         return res
#     return wrapper
# #被装饰
# #@out  #等效于qwq1 = out(qwq1) 
# def qwq1(x,y,z):
#     print("1.成功输入：{},{},{}".format(x,y,z))
#     return 123
# #@out  #等效于qwq2 = out(qwq2)
# def qwq2(x,y,z):
#     print("2.成功输入：{},{},{}".format(x,y,z))
#     return 123
# qwq1(1,2,3)
# qwq2(4,5,6)
#============================================
# #练习
# def login(func):
#     def wrapper(*args,**kwargs):
#         x = input("请输入学号:")
#         y = input("请输入密码:")
#         if x == "20181106069" and y == "369369":
#             res = func(*args,**kwargs)
#             return res
#         else:
#             print("密码错误登录失败")
#     return wrapper

# @login
# def qwq(x):
#     print("登陆{}成功".format(x))
#     return "================="
# res=qwq("小黑")
# print(res)
#=============================
#复习
# from functools import wraps
# def out(func):
#     @wraps(func)#将func函数的属性换给wrapper（有参数装饰器）
#     def wrapper(*args,**kwargs):
#         print("加法计算器")
#         x = input("请输入账号:")
#         y = input("请输入密码:")
#         if x == "qwq" and y =="123":
#             res = func(*args,**kwargs)
#             return res
#         else:
#             print("用户错误")
#     return wrapper
#
# @out
# def qwq(x,y):
#     #加法计算器
#     a = x+y
#     return a
#
# print(qwq(1,2))
# print(qwq.__doc__)
# from functools import wraps
#
# def login(func):
#     x = 1
#     @wraps(func)
#     def wrapper(*args,**kwargs):
#         print(x)
#         return func(*args,**kwargs)
#     return wrapper
#
# @login
# def qwq(num):
#     print(num)
#
# qwq(2)

# from functools import wraps
# def login(func):
#     x = '开始打印了'
#     @wraps(func)
#     def wrapper(*args,**kwargs):
#         print(x)
#         return func(*args,**kwargs)
#     return wrapper
#
# @login
# def qwq(x):
#     print(x)
#
# qwq('hahah')
# from functools import wraps
#
# def awa(x):
#     def login(func):
#         @wraps(func)
#         def wrapper(*args,**kwargs):
#             print(x)
#             return func(*args,**kwargs)
#         return wrapper
#     return login
#
#
# @awa(x='qwqw')
# def qwq(x):
#     print(x)
#
#
# qwq(1212)